/***********************************************************************************************************************************
IO Filter
***********************************************************************************************************************************/
#ifndef IO_FILTER_FILTER_H
#define IO_FILTER_FILTER_H

/***********************************************************************************************************************************
Storage file read object
***********************************************************************************************************************************/
typedef struct IoFilter IoFilter;

#include "common/type/string.h"
#include "common/type/variant.h"

/***********************************************************************************************************************************
Function pointer types
***********************************************************************************************************************************/
typedef void (*IoFilterProcessIn)(void *data, const Buffer *);
typedef Variant *(*IoFilterResult)(void *data);

/***********************************************************************************************************************************
Constructor
***********************************************************************************************************************************/
IoFilter *ioFilterNew(const String *type, void *data, IoFilterProcessIn processIn, IoFilterResult result);

/***********************************************************************************************************************************
Functions
***********************************************************************************************************************************/
void ioFilterProcessIn(IoFilter *this, const Buffer *input);
const Variant *ioFilterResult(IoFilter *this);
IoFilter *ioFilterMove(IoFilter *this, MemContext *parentNew);

/***********************************************************************************************************************************
Getters
***********************************************************************************************************************************/
const String *ioFilterType(IoFilter *this);

/***********************************************************************************************************************************
Macros for function logging
***********************************************************************************************************************************/
#define FUNCTION_DEBUG_IO_FILTER_TYPE                                                                                              \
    IoFilter *
#define FUNCTION_DEBUG_IO_FILTER_FORMAT(value, buffer, bufferSize)                                                                 \
    objToLog(value, "IoFilter", buffer, bufferSize)

#endif
